package com.atguigu.crowd.mvc.handler;

import com.atguigu.crowd.entity.Auth;
import com.atguigu.crowd.entity.Role;
import com.atguigu.crowd.service.api.AdminService;
import com.atguigu.crowd.service.api.AuthService;
import com.atguigu.crowd.service.api.RoleService;
import com.atguigu.crowd.util.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.Map;

/**
 * 分配handler
 * 用于给用户分配角色
 * 给角色分配权限
 * 给菜单分配权限
 */
@Controller
public class AssignHandler {
    @Autowired
    private AdminService adminService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private AuthService authService;


    /**
     * 插入/更新 角色与权限关联表
     * 将某角色选中的权限进行分配
     * 通过ID的方式
     */
    @ResponseBody
    @RequestMapping("/assign/do/role/assign/auth.json")
    public ResultEntity<String> saveRoleAuthRelationship(
            /**
             * 	var requestBody={
             * 				"authIdArray":authIdArray,
             * 				"roleId":[window.roleId]
             *       };
             */
            @RequestBody Map<String,List<Integer>> map
            ){
        authService.saveRoleAuthRelationship(map);
        return ResultEntity.successWithoutData();
    }

    /**
     * 查询权限表 获得所有数据用于在前端构建树形结构
     */
    @ResponseBody
    @RequestMapping("/assign/get/all/auth.json")
    public ResultEntity<List<Auth>> getAllAuth(){

        List<Auth> authList=authService.getAll();

        return ResultEntity.successWithData(authList);
    }

    /**
     * 根据角色ID查询角色与权限关联表
     * 获得某角色已经被分配的权限的ID列表
     * 只需权限ID 不需要权限名称
     */
    @ResponseBody
    @RequestMapping("/assign/get/assigned/auth/id/by/role/id.json")
    public ResultEntity<List<Integer>> getAssignedAuthIdByRoleId(
            @RequestParam("roleId") Integer roleId
    ){
        //查中间表
       List<Integer> authIdList= authService.getAssignedAuthIdByRoleId(roleId);
       return ResultEntity.successWithData(authIdList);
    }


    /**
     * 为某用户分配角色 ---从参数中获取adminId和其被分配的角色ID列表 进行关联表操作
     * @param adminId
     * @param pageNum
     * @param keyword
     * @param roleIdList
     * @return
     */
    @RequestMapping("/assign/do/role/assign.html")
    public String saveAdminRoleRelationship(
            @RequestParam("adminId")Integer adminId,
            @RequestParam("pageNum")Integer pageNum,
            @RequestParam("keyword")String keyword,
            // 我们允许用户在页面上取消所有已分配角色再提交表单，所以可以不提供 roleIdList 请求参数
            // 设置 required=false 表示这个请求参数不是必须的
             @RequestParam(value="roleIdList",required=false)List<Integer>roleIdList
            ){
        adminService.saveAdminRoleRelationship(adminId,roleIdList);

        //重定向到/admin/get/page.html 返回到之前用户维护页
        // 同时为了保持原本所在的页面和查询的关键词 附加PageNum和keyword两个请求参数
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }




    /**
     * 给用户分配角色 首选获得某用户已分配和未分配的角色
     * @param adminId
     * @param modelMap
     * @return
     */
    @RequestMapping("/assign/to/assign/role/page.html")
    public String toAssignRolePage(
            @RequestParam("adminId") Integer adminId,
            ModelMap modelMap
            ){
        //1.查询已分配的角色
        List<Role> assignedRoleList=roleService.getAssignedRole(adminId);


        //2.查询未分配的角色
        List<Role>unAssignedRoleList=roleService.getUnAssignedRole(adminId);

        //3.存入模型
        modelMap.addAttribute("assignedRoleList",assignedRoleList);
        modelMap.addAttribute("unAssignedRoleList",unAssignedRoleList);

        return"assign-role";
    }

}
